package part2;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: shaochong
 * @Date: 2021/8/16
 * @Description:给你二叉树的根结点 root ，请你将它展开为一个单链表：
 *
 * 展开后的单链表应该同样使用 TreeNode ，其中 right 子指针指向链表中下一个结点，而左子指针始终为 null 。
 * 展开后的单链表应该与二叉树 先序遍历 顺序相同。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Solution114 {
    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    public void flatten(TreeNode root) {
        List<TreeNode> list = new ArrayList<>();
        preFs(root, list);

        TreeNode ans = new TreeNode();

        for (int i = 1; i < list.size(); i++) {
            TreeNode prev = list.get(i-1);
            TreeNode current = list.get(i);
            prev.left = null;
            prev.right = current;
        }
    }
    
    public void preFs(TreeNode root, List<TreeNode> ans) {
        if (root == null) {
            return;
        }
        ans.add(root);
        preFs(root.left, ans);
        preFs(root.right, ans);
    }
}
